import java.util.Scanner;

public class GameControl {
	GameData gameData; // 游戏数据对象
	Menu menu; // 菜单对象

	// 构造函数，初始化游戏数据和菜单
	GameControl(GameData gameData, Menu menu) {
		this.gameData = gameData;
		this.menu = menu;
	}

	// 游戏开始方法
	void gameStart() {

		Scanner keyboardInput = new Scanner(System.in); // 创建键盘输入扫描器
		boolean invincible = false; // 无敌模式标志
		while (true) {
			String input = keyboardInput.next(); // 获取用户输入
			// 检查输入是否合法
			if (input.length() != 1 || (input.charAt(0) != 'a' && input.charAt(0) != 's' && input.charAt(0) != 'd'
					&& input.charAt(0) != 'w' && input.charAt(0) != '0' && input.charAt(0) != 'q')) {
				System.out.println("Wrong Input."); // 输入错误提示
				continue; // 继续下一次循环
			}
			if (input.charAt(0) == '0')
				menu.enterMenu(); // 进入菜单
			else if (input.charAt(0) == 'q')
				invincible = !invincible; // 切换无敌模式
			else
				handleInput(input.charAt(0), invincible); // 处理输入并传递无敌模式标志
			gameData.printMap(); // 打印地图
		}
	}

	// 处理用户输入的方法
	void handleInput(char inC, boolean invincible) {
		int tX = 0, tY = 0; // 临时坐标变量
		// 根据输入的方向更新坐标
		if (inC == 'a') {
			tX = gameData.pX;
			tY = gameData.pY - 1;
		}
		if (inC == 's') {
			tX = gameData.pX + 1;
			tY = gameData.pY;
		}
		if (inC == 'd') {
			tX = gameData.pX;
			tY = gameData.pY + 1;
		}
		if (inC == 'w') {
			tX = gameData.pX - 1;
			tY = gameData.pY;
		}
		// 根据地图上的内容执行相应的操作
		if (gameData.map[gameData.currentLevel][tX][tY] == 2) { // 如果是钥匙
			gameData.keyNum++; // 增加钥匙数量
			moveHero(tX, tY); // 移动英雄
		} else if (gameData.map[gameData.currentLevel][tX][tY] == 3 && gameData.keyNum > 0) { // 如果是门且有钥匙
			gameData.keyNum--; // 减少钥匙数量
			moveHero(tX, tY); // 移动英雄
		} else if (gameData.map[gameData.currentLevel][tX][tY] == 4) { // 如果是传送门
			gameData.map[gameData.currentLevel][gameData.pX][gameData.pY] = 1; // 当前格子变为空地
			gameData.currentLevel++; // 进入下一关
			// 找到新关卡的起始位置
			for (int i = 0; i < gameData.H; i++)
				for (int j = 0; j < gameData.W; j++)
					if (gameData.map[gameData.currentLevel][i][j] == 6) {
						gameData.pX = i;
						gameData.pY = j;
					}
		} else if (gameData.map[gameData.currentLevel][tX][tY] == 5) { // 如果是胜利点
			System.out.print("You Win!!"); // 打印胜利信息
			System.exit(0); // 退出游戏
		} else if (gameData.map[gameData.currentLevel][tX][tY] > 10) { // 如果是加血道具
			gameData.heroHealth += gameData.map[gameData.currentLevel][tX][tY]; // 增加英雄血量
			moveHero(tX, tY); // 移动英雄
		} else if (gameData.map[gameData.currentLevel][tX][tY] == 1) { // 如果是空地
			moveHero(tX, tY); // 移动英雄
		} else if (gameData.map[gameData.currentLevel][tX][tY] < 0) { // 如果是怪物
			if (invincible) { // 如果是无敌模式
				System.out.println("Invincible mode: Monster defeated!"); // 打印无敌模式信息
				moveHero(tX, tY); // 移动英雄
			} else if (gameData.map[gameData.currentLevel][tX][tY] + gameData.heroHealth <= 0) { // 如果英雄血量不足
				System.out.print("That monster has " + Integer.toString(-gameData.map[gameData.currentLevel][tX][tY])
						+ " power, You Lose!!"); // 打印失败信息
				System.exit(0); // 退出游戏
			} else {
				gameData.heroHealth += gameData.map[gameData.currentLevel][tX][tY]; // 减少英雄血量
				moveHero(tX, tY); // 移动英雄
			}
		}
	}

	// 移动英雄的方法
	void moveHero(int tX, int tY) {
		gameData.map[gameData.currentLevel][gameData.pX][gameData.pY] = 1; // 当前格子变为空地
		gameData.map[gameData.currentLevel][tX][tY] = 6; // 新位置变为英雄位置
		gameData.pX = tX; // 更新英雄X坐标
		gameData.pY = tY; // 更新英雄Y坐标
	}
}
